"""
自动化打包脚本
使用 PyInstaller 将 Python 程序打包为单个 EXE 文件
"""

import os
import sys
import shutil
import subprocess
from pathlib import Path


def clean_build_dirs():
    """清理构建目录"""
    print("正在清理构建目录...")
    
    dirs_to_clean = ['build', 'dist', '__pycache__']
    for dir_name in dirs_to_clean:
        if os.path.exists(dir_name):
            shutil.rmtree(dir_name)
            print(f"已删除目录: {dir_name}")
    
    # 清理 .pyc 文件
    for root, dirs, files in os.walk('.'):
        for file in files:
            if file.endswith('.pyc'):
                os.remove(os.path.join(root, file))
    
    print("构建目录清理完成")


def check_dependencies():
    """检查依赖包是否已安装"""
    print("正在检查依赖包...")
    
    required_packages = ['psutil', 'PyQt5', 'pyinstaller']
    missing_packages = []
    
    for package in required_packages:
        try:
            __import__(package)
            print(f"✓ {package} 已安装")
        except ImportError:
            missing_packages.append(package)
            print(f"✗ {package} 未安装")
    
    if missing_packages:
        print(f"\n缺少以下依赖包: {', '.join(missing_packages)}")
        print("请运行以下命令安装:")
        print("pip install -r requirements.txt")
        return False
    
    print("所有依赖包检查完成")
    return True


def build_executable():
    """构建可执行文件"""
    print("开始构建可执行文件...")
    
    try:
        # 使用 spec 文件构建
        if os.path.exists('app.spec'):
            print("使用 app.spec 配置文件构建...")
            cmd = ['pyinstaller', 'app.spec', '--clean']
        else:
            print("使用默认配置构建...")
            cmd = [
                'pyinstaller',
                '--onefile',
                '--windowed',
                '--name=SystemMonitor',
                '--clean',
                '--add-data=ui;ui',
                'main.py'
            ]
        
        # 执行构建命令
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("构建成功!")
            return True
        else:
            print("构建失败!")
            print("错误信息:")
            print(result.stderr)
            return False
            
    except Exception as e:
        print(f"构建过程中发生错误: {e}")
        return False


def post_build_tasks():
    """构建后任务"""
    print("执行构建后任务...")
    
    # 检查生成的文件
    exe_path = Path('dist/SystemMonitor.exe')
    if exe_path.exists():
        file_size = exe_path.stat().st_size / (1024 * 1024)  # MB
        print(f"✓ 可执行文件已生成: {exe_path}")
        print(f"✓ 文件大小: {file_size:.1f} MB")
        
        # 创建发布目录
        release_dir = Path('release')
        if not release_dir.exists():
            release_dir.mkdir()
        
        # 复制文件到发布目录
        release_exe = release_dir / 'SystemMonitor.exe'
        shutil.copy2(exe_path, release_exe)
        
        # 复制说明文件
        if Path('README.md').exists():
            shutil.copy2('README.md', release_dir / 'README.md')
        
        print(f"✓ 发布文件已复制到: {release_dir}")
        
        return True
    else:
        print("✗ 未找到生成的可执行文件")
        return False


def main():
    """主函数"""
    print("=" * 50)
    print("Windows 系统监控工具 - 自动化打包脚本")
    print("=" * 50)
    
    # 检查当前目录
    if not os.path.exists('main.py'):
        print("错误: 请在项目根目录下运行此脚本")
        return False
    
    # 步骤1: 清理构建目录
    clean_build_dirs()
    print()
    
    # 步骤2: 检查依赖
    if not check_dependencies():
        return False
    print()
    
    # 步骤3: 构建可执行文件
    if not build_executable():
        return False
    print()
    
    # 步骤4: 构建后任务
    if not post_build_tasks():
        return False
    
    print()
    print("=" * 50)
    print("打包完成!")
    print("可执行文件位置: release/SystemMonitor.exe")
    print("您可以将此文件复制到任何 Windows 电脑上运行")
    print("=" * 50)
    
    return True


if __name__ == '__main__':
    try:
        success = main()
        if not success:
            print("\n打包失败，请检查错误信息")
            sys.exit(1)
    except KeyboardInterrupt:
        print("\n\n用户中断了打包过程")
        sys.exit(1)
    except Exception as e:
        print(f"\n打包过程中发生未预期的错误: {e}")
        sys.exit(1)